程序是个状态机
// PC: instruction | // label: statement
0: mov r1, 0 | pc0: r1 = 0;
1: mov r2, 0 | pc1: r2 = 0;
2: addi r2, r2, 1 | pc2: r2 = r2 + 1;
3: add r1, r1, r2 | pc3: r1 = r1 + r2;
4: blt r2, 100, 2 | pc4: if (r2 < 100) goto pc2; // branch if less than
5: jmp 5 | pc5: goto pc5;
这个程序比较简单, 需要更新的状态只包括PC
和r1
, r2
这两个寄存器, 因此我们用一个三元组(PC, r1, r2)
就可以表示程序的所有状态, 而无需画出内存的具体状态. 初始状态是(0, x, x)
, 此处的x
表示未初始化. 程序PC=0
处的指令是mov r1, 0
, 执行完之后PC
会指向下一条指令, 因此下一个状态是(1, 0, x)
. 如此类推, 我们可以画出指令的状态转移过程:
(0, x, x) -> (1, 0, x) -> (2, 0, 0) -> (3, 0, 1) -> (4, 1, 1) -> (2, 1, 1) -> (3, 1, 2) -> (4, 3, 2) -> ······ (2, 4851, 98) -> (3, 4851, 99) -> (4, 4950, 99) -> (2, 4950, 99) -> (3, 4950, 100) -> (4, 5050, 100) -> (5, 5050, 100) ->